package com.answer.service;

import com.answer.entity.Question;
import com.answer.model.dto.question.QuestionQueryRequest;
import com.answer.model.vo.QuestionVO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import jakarta.servlet.http.HttpServletRequest;

/**
 * 题目服务
 */
public interface QuestionService extends IService<Question> {

    /**
     * 校验数据
     * 此方法用于在校验问题对象时提供统一的入口，确保数据的完整性和一致性，
     * 避免不合法的数据被添加或修改。
     *
     * @param question 问题对象，需要进行校验的数据
     * @param add 操作标识，true表示新增数据，false表示修改数据
     *             在新增和修改操作中，校验的规则可能会有所不同
     */
    void validQuestion(Question question, boolean add);

    /**
     * 获取查询条件
     * 此方法用于根据用户提供的查询请求构建一个查询包装器，以便对问题（Question）进行条件查询。
     * 它通过提取请求中的参数来生成一个灵活的查询条件，从而允许按需筛选数据。
     *
     * @param questionQueryRequest 用户的查询请求，其中包含了查询条件的详细信息
     * @return 返回一个QueryWrapper对象，该对象包含了构建好的查询条件，可用于数据库查询
     */
    QueryWrapper<Question> getQueryWrapper(QuestionQueryRequest questionQueryRequest);

    /**
     * 获取题目封装
     * 此方法的目的是将问题对象转换为视图对象（VO），以便在UI层面展示问题的详细信息它不仅处理问题对象，
     * 还考虑了HTTP请求的上下文，这使得它能够根据请求的上下文（如用户信息、会话状态等）来定制化问题的视图对象
     *
     * @param question 问题对象，包含问题的所有详细信息
     * @return 返回一个QuestionVO对象，其中包含了经过定制化处理的问题信息，用于展示在UI上
     */
    QuestionVO getQuestionVO(Question question);


    /**
     * 分页获取题目封装
     * 该方法主要用于处理分页请求，从数据库中获取分页后的题目数据，并将其转换为视图对象
     * 这样做的目的是为了提高数据处理的灵活性和可维护性，同时便于前端展示分页数据
     *
     * @param questionPage 分页的题目数据对象 分页对象包含了分页参数和排序信息，用于控制数据的获取范围和顺序
     * @return 返回一个分页的QuestionVO对象列表 包含了分页后的题目视图对象，便于前端展示 使用视图对象是为了将后端数据结构与前端展示逻辑解耦
     */
    Page<QuestionVO> getQuestionVOPage(Page<Question> questionPage);
}

